package com.mocai.merchant.core.mapper;

import com.mocai.merchant.core.domain.Sortable;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

/**
 * 可排序的Mapper
 */
@Repository
public interface SortableMapper {
    /**
     * 对 source 和 target 进行位置交换
     *
     * @param source     源
     * @param target     目标
     * @param table      表名
     * @param idColumn   主键列
     * @param sortColumn 排序列
     * @param <T>        可排序的实体
     */
    <T extends Sortable> void exchange(@Param("source") T source, @Param("target") T target, @Param("table") String table, @Param("idColumn") String idColumn, @Param("sortColumn") String sortColumn);

    /**
     * 把 from 移动到 to
     *
     * @param from
     * @param to
     * @param table
     * @param idColumn
     * @param sortColumn
     * @param <T>
     */
    <T extends Sortable> void move(@Param("from") T from, @Param("to") T to, @Param("table") String table, @Param("idColumn") String idColumn, @Param("sortColumn") String sortColumn);

    /**
     * 查询当前行的上一行
     *
     * @param model
     * @param table
     * @param idColumn
     * @param sortColumn
     * @param <T>
     * @return
     */
    <T extends Sortable> Object selectPrevious(@Param("model") T model, @Param("table") String table, @Param("idColumn") String idColumn, @Param("sortColumn") String sortColumn);

    /**
     * 查询当前行的下一行
     *
     * @param model
     * @param table
     * @param idColumn
     * @param sortColumn
     * @param <T>
     * @return
     */
    <T extends Sortable> Object selectNext(@Param("model") T model, @Param("table") String table, @Param("idColumn") String idColumn, @Param("sortColumn") String sortColumn);

    /**
     * 查询第一条记录
     *
     * @param table
     * @param idColumn
     * @param sortColumn
     * @param <T>
     * @return
     */
    <T extends Sortable> Object selectFirst(@Param("table") String table, @Param("idColumn") String idColumn, @Param("sortColumn") String sortColumn);

    /**
     * 查询最后一条记录
     *
     * @param table
     * @param idColumn
     * @param sortColumn
     * @param <T>
     * @return
     */
    <T extends Sortable> Object selectLast(@Param("table") String table, @Param("idColumn") String idColumn, @Param("sortColumn") String sortColumn);
}